#include "SqQueue.h"

/**
保留一个元素空间，当队列里元素不为空时，使得rear不会等于front，从而区分空队列和满队列的情况
rear=front时，是空队列
(rear+1)%MAXSIZE=front时，时满队列
**/


int InitQueue(SqQueue *Q){
	for (int i = 0; i < MAXSIZE; ++i)
	{
		Q->data[i] = NULL;
		Q->front = 0;
		Q->rear = 0;
	}
	return 0;
}

int DestroyQueue(SqQueue *Q){ 			//若队列Q存在，则销毁它
	if(Q!=NULL){
		free(Q);
		Q=NULL;
	}

}
int ClearQueue(SqQueue *Q){				//将队列Q清空
	while(Q->front!=Q->rear){
		free(Q->data[Q->front]);
		Q->data[Q->front] = NULL;	
		Q->front++;
	}
	return 0;
}
bool QueueEmpty(SqQueue Q){				//若队列Q为空，返回true，否则返回false	
	// int length = (Q.rear-Q.front+QueueSize) % MAXSIZE;
	// return length==0?true:false;
	if(Q.rear==Q.front)
		return true;
	return false;
}
int GetHead(SqQueue Q,String *e){		//若队列Q存在且非空，用e返回队列Q的队头元素
	*e = Q.data[Q.front];
	return 0;
}
int EnQueue(SqQueue *Q,String *e){		//若队列Q存在，插入新元素e到队列Q中并成为队尾元素
	if((Q->rear+1)%MAXSIZE==Q->front)
		return -1;
	Q->data[Q->rear] = *e;
	Q->rear = (Q->rear+1)%MAXSIZE;
	return 0;
}
int Dequeue(SqQueue *Q,String *e){		//删除队列Q中队头元素，并用e返回其值
	if(Q->rear==Q->front)
		return -1;
	*e = Q->data[Q->front];
	Q->front = (Q->front+1)%MAXSIZE;
	return 0;
}
int QueueLength(SqQueue Q){				//返回队列Q的元素个数
	return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

